/**
* 参数处理
* @param {*} params  参数
*/
export const tansParams=(params:any)=>{
    let result = ''
    for (const propName of Object.keys(params)) {
      const value = params[propName];
      const part = encodeURIComponent(propName) + "=";
      if (value !== null && value !== "" && typeof (value) !== "undefined") {
        if (typeof value === 'object') {
          for (const key of Object.keys(value)) {
            if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') {
              const params = propName + '[' + key + ']';
              const subPart = encodeURIComponent(params) + "=";
              result += subPart + encodeURIComponent(value[key]) + "&";
            }
          }
        } else {
          result += part + encodeURIComponent(value) + "&";
        }
      }
    }
    return result
}
/**
 * 这个是一个随机产生字符串的函数
 * @param {object} cfg 参数
    cfg = {
        split:  '',                 // 分割字符 
        splitNum: 0,                // 分隔个数
        num: 16,                    // 产生随机字符个数 默认16
        char: 'dAa',                // d数字 A大写的字符 a小写的字符  默认dAa
        append: '@*!+-=*&[()`?.]',  // 添加的其他额外字符,支持数组[]和字符串 默认@*!+-=*&[()`?.
        ignore: '',                 // 可以忽略的字符，支持数组[]和字符串 优先级最高 
    }
 * @returns 返回随机字符串
 */
export const createRandomString = (cfg?:any) => {
      if(cfg === undefined) cfg = {append:''}
      const getValue = (s:any, d:string) => {
          if([undefined, null].includes(s)) return d
          else return s
      }
      cfg = {
          split:  getValue(cfg.split, ''),    // 分割字符 
          splitNum: parseInt(cfg.splitNum) || 0,   // 分隔个数
          num: parseInt(cfg.num) || 6,             // 字符个数 默认6
          char: getValue(cfg.char, 'dAa') ,        // d数字 A大写的字符 a小写的字符
          //append: getValue(cfg.append, '@*!+-=*&[()`?.') , // 支持数组[]和字符串 一般指特殊字符@*!+-=*&[()`?.
          append: getValue(cfg.append, '') ,//默认不支持特殊字符
          ignore: getValue(cfg.ignore, '')                       // 支持数组[]和字符串 优先级最高 
      }
      // console.log(cfg)
      const set = new Set()
      const getChars = (str:string) => {
          for(const s of str) set.add(s)
      }
      // 1、先取出append特殊字符的编码
      getChars(cfg.append)
      // 2、获取char中的字符集
      const number = "0123456789"
      const bigChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      const smallChars = "abcdefghijklmnopqrstuvwxyz"
      for(const s of cfg.char) {
          if(s === 'd') getChars(number)
          else if (s === 'A') getChars(bigChars)
          else if (s === 'a') getChars(smallChars)
          // 其他的字符 自动忽略
      }
      // 3. 排除ignore忽略的元素
      for(const s of cfg.ignore) set.delete(s)
      // 4. 生成数组
      const arr = Array.from(set)
      // console.log(arr)
      // 5. 打乱集合 
      const swap = (firstIndex:number, secondIdex:number) => {
          const t = arr[firstIndex]
          arr[firstIndex] = arr[secondIdex]
          arr[secondIdex] = t
      }
      const size = arr.length
      for(let i = 0; i < cfg.num; i++) swap(Math.floor(Math.random() * size), Math.floor(Math.random() * size))
      // 6、生成随机字符串
      let re = ""
      for(let i = 0; i < cfg.num; i++) {
          if(i % cfg.splitNum === 0 && i !== 0) re += cfg.split
          re += arr[Math.floor(Math.random() * size)]
      }
      return re
}


export const copyToClipboard=(text:string)=>{
  // 优先使用 Clipboard API
  if (navigator.clipboard) {
    return navigator.clipboard.writeText(text).then(() => {
      console.log('使用Clipboard API复制成功');
      return true;
    }).catch(err => {
      console.warn('Clipboard API失败，回退到execCommand', err);
      return fallbackCopyText(text);
    });
  } else {
    // 不支持Clipboard API则使用execCommand
    return Promise.resolve(fallbackCopyText(text));
  }
}

const fallbackCopyText=(text:string)=>{
  const textarea = document.createElement('textarea');
  textarea.value = text;
  textarea.style.position = 'fixed';  // 防止页面滚动
  document.body.appendChild(textarea);
  textarea.select();
  
  try {
    const successful = document.execCommand('copy');
    if (!successful) {
      throw new Error('execCommand复制失败');
    }
    console.log('使用execCommand复制成功');
    return true;
  } catch (err) {
    console.error('复制失败: ', err);
    return false;
  } finally {
    document.body.removeChild(textarea);
  }
}